function isObject(obj) {
    let type = typeof obj;
    return obj !== null && (type === "object" || type === 'function');
}

function deepClone(obj) {
    if (!isObject(obj)) return obj;

    // 增加缓存机制
    if (cache.has(target)) {
        return target;
    }
    cache.add(target);

    let cloneTarget = Array.isArray(obj) ? [] : {};
    // for (let k in obj) {
    //     if (obj.hasOwnProperty(k)) {
    //         if (typeof obj[k] === 'object') {
    //             cloneTarget[k] = deepClone(obj[k]);
    //         } else {
    //             cloneTarget[k] = obj[k];
    //         }
    //     }
    // }
    // Reflect.ownKeys(obj).forEach(key => {//自有属性key，不管是否可枚举，但不包括继承自原型的属性。
    //     cloneTarget[key] = deepClone(obj[key]); // 递归进行拷贝
    // });

    Object.keys(obj).forEach(key => {// 可枚举自身属性,不包括不可枚举的属性 和 继承自原型的属性。
        cloneTarget[key] = deepClone(obj[key]); // 递归进行拷贝
    });
    return cloneTarget;
}

var obj = {
    name: "qqq",
    // fn: (function (x) {
    //     return x + 10;
    // })(this.name)
};
console.log(deepClone(obj));